package com.mlh.service.impl;

public class StaticInnerClass01 {
    public static void main(String[] args) {
        Outer10 outer10 = new Outer10();
        outer10.m1();
        //直接访问内部类的静态方法
        Outer10.Inner10.smile();
        // 外部其他类 使用静态内部类
        // 方式 1
        // 因为静态内部类，是可以通过类名直接访问(前提是满足访问权限)
        Outer10.Inner10 inner10 = new Outer10.Inner10();
        inner10.say();
        // 方式 2
        // 编写一个方法，可以返回静态内部类的对象实例.
        //对象.方法
        Outer10.Inner10 inner101 = outer10.getInner10();
        System.out.println("============");
        inner101.say();
        //类.方法
        Outer10.Inner10 inner10_ = Outer10.getInner10_();
        System.out.println("************");
        inner10_.say();
    }
}
class Outer10 { // 外部类
    private int n1 = 10;
    private static String name = "张三";
    private static void cry() {
    }

    // Inner10 就是静态内部类
    // 1. 放在外部类的成员位置
    // 2. 使用 static 修饰
    // 3. 可以直接访问外部类的所有静态成员，包含私有的，但不能直接访问非静态成员
    // 4. 可以添加任意访问修饰符(public、protected 、默认、private),因为它的地位就是一个成员
    // 5. 作用域 ：同其他的成员，为整个类体
    static class Inner10 {
        private static String name = "韩顺平教育";

        //内部类中 非静态方法   同时也说明静态内部类中可以有非静态方法
        public void say() {
            // 如果外部类和静态内部类的成员重名时，静态内部类访问的时，
            // 默认遵循就近原则，如果想访问外部类的成员，则可以使用 （外部类名.成员）
            System.out.println(name + " 外部类 name= " + Outer10.name);
            cry();
        }
        //内部类中 静态方法
        public static void smile(){
            System.out.println("笑笑笑笑笑笑笑");
        }
    }

    public void m1() { // 外部类---访问------>静态内部类 访问方式：创建对象，再访问
        Inner10.smile();
        Inner10 inner10 = new Inner10();
        inner10.say();
    }
    //非静态方法
    public Inner10 getInner10() {
        return new Inner10();
    }
    //静态方法
    public static Inner10 getInner10_() {
        return new Inner10();
    }
}
